package io.github.weiranyi.codeMessage;

import redis.clients.jedis.Jedis;

import java.util.Random;
import java.util.Scanner;

/*
要求：
1、输入手机号，点击发送后随机生成6位数字码，2分钟有效 [使用redis的命令：setex key 过期时间]
2、输入验证码，点击验证，返回成功或失败
3、每个手机号每天只能输入3次
    - 使用redis存储输入次数
        - 第一次 get key，返回nil，set key 1
        - 第二次 get key，返回1，set key 2 访问次数+1
        - 第三次 get key，返回2，set key 3 访问次数+1
        - 第四次 get key，返回3，不可以访问，返回错误提示
4、redis存储验证码和访问次数
    - 一个key怎么存储两个内容
    - 设置两个key：code:phone 和 count:phone
        - code:198128***
        - count:198128***
 */
public class CodeMessage {
    public static void main(String[] args) {
        //1、输入手机号
        Scanner input = new Scanner(System.in);
        System.out.println("请输入手机号码：");
        String phone = input.next();
        //2.获取验证码：发送手机号码得到code，2min有效
        System.out.println("输入1完成发送：");
        input.next();
        String code = getCode(phone);
        if ("-1".equals(code)) {
            System.out.println("今天输入验证码已经超过3次，请明天再试");
            return;
        }
        System.out.println("验证码是：" + code);
        //3、输入验证码，点击验证，返回成功或失败
        System.out.println("请输入验证码：");
        String myCode = input.next();
        System.out.println("输入1进行验证");
        input.next();
        boolean flag = verifyCode(phone, myCode);
        //4.输出结果
        if (flag) {
            System.out.println("成功");
        } else {
            System.out.println("失败");
        }
    }

    // 生成6位数字验证码
    public static String generateCode() {
        // 获取Random对象
        Random random = new Random();
        String code = "";
        for (int i = 0; i < 6; i++) {
            // 设置上限为10
            int rand = random.nextInt(10);
            code += rand;
        }
        return code;
    }

    //  发送手机号码，返回验证码
    public static String getCode(String phone) {
        Jedis jedis = new Jedis("192.168.128.128", 6379);
        //1.生成验证码
        String code = generateCode();
        //2.将验证码保存在redis中，两分钟有效
        String codeKey = "code:" + phone;
        jedis.setex(codeKey, 120, code);
        //3.每个手机号每天只能输入3次
        String countKey = "count:" + phone;
        String count = jedis.get(countKey);
        if (count == null) { //如果是第一次,设置次数为1次
            jedis.setex(countKey, 24 * 60 * 60, "1");
        } else if (Integer.parseInt(count) <= 2) { //如果是第二次或者第三次,设置次数+1
            jedis.incr(countKey);
        } else {//如果超过3次,给出次数超过的提示
            //code ="今天输入验证码已经超过3次，请明天再试";
            code = "-1";
        }
        jedis.close();
        //4.返回结果(验证码或者超过3次提示)
        return code;
    }

    // 进行验证
    private static boolean verifyCode(String phone, String myCode) {
        boolean flag = false;//默认失败
        Jedis jedis = new Jedis("192.168.128.128", 6379);
        //1.获取保存在redis中的正确验证码
        String codeKey = "code:" + phone;
        String code = jedis.get(codeKey);
        //2.输入的code和get到的code相等
        if (code != null && myCode.equals(code)) {
            flag = true;
        }
        jedis.close();
        return flag;
    }
}
